Repository navigation
Deck reader: case-insensitive node names and .equiv pseudonyms - #164
loom-fleet-dispatch[bot] wants to merge 2 commits into
Conversation
|
Code review completed for head 2b47666; no blocking code findings from inspection of the full diff and issue #156. Approval remains conditional on completed CI. Verification:
Releasing |
|
Judge pass: still carries a fresh Stand-down passes against this claim: 7 of 3 before the bounded fallback force-reclaims it. This comment is edited in place on each pass rather than reposted (#5123, #6514). |
|
Landing order recorded — this PR overlaps other open work Planned by the merge-sequencing pass (#9686): this PR lands AFTER #162, because it changes files #162 also changes. Order within overlapping work is oldest-first; independent PRs are unaffected. While the Automated by loom-daemon claim reconciliation (#9686, plan seq-50a92217) |
|
✅ Approved! Reviewed
PR description uses |
|
Champion: Cannot Auto-Merge The live required-check freshness guard refused this PR because its classic branch-protection GraphQL lookup returned Resource not accessible by integration. Restore credential access before retrying. Keeping loom:pr; no guard bypassed. Automated by Champion role |
|
Champion: Cannot Auto-Merge Required-check freshness guard failed closed (exit 2): classic branch-protection lookup returned Resource not accessible by integration. CI passes; current authentication cannot verify freshness. No merge attempted. Keeping loom:pr for re-evaluation. Automated by Champion role |
|
Champion Auto-Merge This PR meets all safety criteria for automatic merging:
Proceeding with merge... If this was merged in error, you can revert with: Automated by Champion role |
|
Landing order recorded — this PR overlaps other open work Planned by the merge-sequencing pass (#9686): this PR lands AFTER #161, because it changes files #161 also changes. Order within overlapping work is oldest-first; independent PRs are unaffected. While the Automated by loom-daemon claim reconciliation (#9686, plan seq-e1484931) |
|
Champion Auto-Merge This PR meets all safety criteria for automatic merging:
Proceeding with merge... If this was merged in error, revert with Automated by Champion role |
|
Champion: Merge Failed Auto-merge failed because the required-check freshness guard could not query branch protection ( Restore the integration token's branch-protection read permission or perform an equivalent verified manual merge. Automated by Champion role |
|
Champion Auto-Merge Fresh approval covers current head. Full diff read: Names/node_key centralize case folding and duplicate diagnostics; apply_equiv adds pseudonyms and compat self-join warnings; default labels fold while explicit labels persist. Regression tests cover every name position and alias/error cases. Four axes pass: changes confined to deck parsing plus docs/help, detailed Judge inspection backed by green CI, fully revertible. Fresh complete file list has no critical paths; MERGEABLE, real activity within 24h; seven checks pass, codesmith skips. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed Guarded merge exited 1: required-check freshness lookup returned Automated by Champion role |
|
Champion Auto-Merge Current-head approval is fresh. Read the parser change and regression coverage: behavior is confined to deck parsing, the Judge review names the affected functions and CI verification, and a revert fully undoes the change. All four risk axes pass, with no prior risk hold. Fresh paginated file inspection passed the critical-file loop. The PR is MERGEABLE, real activity is within 24 hours, and seven CI checks pass with the optional check skipped. Proceeding through the guarded merge script. Automated by Champion role |
|
Champion: Merge Failed Guarded merge exited 1: the required-check freshness lookup returned Automated by Champion role |
|
Champion: PR Is Stale Not updated within the recency window (24h) — routed out of the auto-merge queue for a rebase/refresh. Next steps:
Automated by Champion role |
|
Verdict anchored to the current head — no marker had been recorded This PR carries This comment records the head SHA as of now, Anchoring bounds future exposure; it cannot reconstruct which tree was actually reviewed. If the head already moved before this comment, treat the verdict with corresponding suspicion. Automated by loom-daemon claim reconciliation (#6319) |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
This champion's PR lease (sweep |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
Champion: Cannot Auto-Merge Cannot auto-merge:
Next steps:
Keeping Automated by Champion role |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
|
PR #164's |
Closes #156
Part of #76.
Summary
Nameskeys every node name by its lowercase form, soN3declared andn3referenced are one node in every position: node declarations, in-plane node declarations (andcontact equiv_rect/connectionnodes),Eendpoints,.external,.equiv. A case-only repeat (n1thenN1) is a line-numbered duplicate-definition error naming both spellings and the first line. Output choice: names are lowercased (the default<+>/<->port label); an explicit.externallabel is a label, not a node name, and is kept as written.unknown nodeerrors still quote the name as the deck wrote it..equivpseudonyms (all modes, User's Guide §1.3.7). The first defined name in the list is canonical. Other defined names alias to it as before. Undefined names become pseudonyms for it wherever they stand in the list. If no name in the list is defined, the error isno defined node in .equiv. Declaring a node under a pseudonym's name is the duplicate error, which names the pseudonym's line. There are still no forward references forEendpoints and.external.--fasthenry-compatonly:.equivnaming one node twice (.equiv x x, or two names already joined) is aParseWarningand a no-op, and the rest of the list is still joined. Natively it is still an error.docs/fasthenry-compat.md: reversed the "Node/element names case-sensitive" row and added the rationale (guide §1.1/§1.3, the guide's own §1.2N3/.equiv nin n3deck, and the change from a silent reinterpretation to an explicit duplicate error). Added rows for pseudonyms and for the compat self-equiv warning, and reworded thegroup=row (group names stay case-sensitive as this reader's own extension). Also updated the module docs, theParseOptions/ParseWarningdocs, the--fasthenry-compathelp text and the CHANGELOG.Tests (
fasterhenry-cli/src/inp.rs)node_names_are_case_insensitive_in_every_position: a mixed-case deck equals the lowercase one, and the port labels are checked.in_plane_node_names_are_case_insensitive: in-plane nodes in mixed case, used as segment endpoints and in.equivand.external.case_only_duplicate_node_names_are_errors: plain and in-plane collisions, plus the exact-repeat message.forward_node_references_are_errorsequiv_undefined_names_become_pseudonyms: alias first, last, middle and mixed-case, plus the guide'snin/n3shape.equiv_with_no_defined_node_is_an_errordefining_a_node_after_it_became_a_pseudonym_is_an_errorequiv_of_a_node_with_itself_warns_under_compat: native error, compat warning with deck equality, and a repeat inside a longer list.Verification
cargo test -p fasterhenry-cli: 132 passedcargo clippy --workspace --all-targets -- -D warnings: cleancargo fmt --all -- --check: cleanClean-room: implemented from the issue spec and the public User's Guide only. No FastHenry source or example decks were consulted.
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.